########################
# 本文件是第五课中传统的动画帧的实现方式
########################
# 1. 翻书动画演示，理解帧的概念
# 2. 传统的实现方式讲解
# 3. 利用精灵类如何快速实现
import pygame
import time
# 引入pygame中所有常量，比如 QUIT
from pygame.locals import *

# 初始化
pygame.init()
# 设置一个基础的窗口
screen = pygame.display.set_mode((800, 800))
# 背景色为白色
screen.fill((255, 255, 255))
# 加载一张图片，并设置透明
run1 = pygame.image.load("./img/run1.png").convert_alpha()
run2 = pygame.image.load("./img/run2.png").convert_alpha()
run3 = pygame.image.load("./img/run3.png").convert_alpha()
# 把我们图片设置大小
run1 = pygame.transform.scale(run1, (50, 50))
run2 = pygame.transform.scale(run2, (50, 50))
run3 = pygame.transform.scale(run3, (50, 50))

x = 0
y = 650

# 定义是否正在跳跃的变量
jumping = False
# 定义跳跃的高度
jumping_height = 0

# 定义一个跳跃的方法


def jump():
    global jumping
    # 跳跃中
    if(jumping):
        jumping_handler()
    else:
        # 跳跃结束，回落
        jump_down_handler()

# 定义跳跃上升阶段的方法


def jumping_handler():
    global jumping,  jumping_height, y
    jumping_height = jumping_height + 10
    # 跳跃的速度为10
    y = y - 10
    # 每次跳跃达到200时，就结束跳跃
    if(jumping_height >= 200):
        # 重置为0，给下一次跳跃做准备
        jumping_height = 0
        # 跳跃结束，并设置开始回落
        jumping = False


# 定义跳跃下落阶段的方法
def jump_down_handler():
    global y
    # 下落的速度为10
    y = y + 10
    # 回落到底部
    if(y >= 650):
        y = 650


# 记录当前移动了几次，用于控制图片的切换
i = 0
# 默认朝向左边吗，false表示朝向右边
left = False

# 定义一个数数的方法
def count():
    # 将变量i进行123,123的循环数数
    global i
    i = i + 1
    if(i == 4):
        i = 1


# 无限循环，让窗口停留
while True:
    # 退出程序
    for event in pygame.event.get():
        if event.type == QUIT:
            exit()

    # 获取当前的KeyList，判断对应按钮是否有被按下，可以解决输入法问题
    keyList = pygame.key.get_pressed()
    if keyList[pygame.K_LEFT]:
        # 每次移动都要数数
        count()
        x = x - 10
        left = True
    if keyList[pygame.K_RIGHT]:
        # 每次移动都要数数
        count()
        x = x + 10
        left = False
    if keyList[pygame.K_SPACE]:
        # 按了一下空格，设置跳跃标志为True，同时阻止正在下落的状态
        jumping = True

    # 执行跳跃
    jump()
    # 防止跑出屏幕右边距
    if(x >= 650):
        x = 650
    # 防止跑出屏幕左边距
    if(x <= 0):
        x = 0
    # 防止跑出屏幕下边距
    if(y >= 650):
        y = 650
    # 防止跑出屏幕上边距
    if(y <= 0):
        y = 0

    # 刷新背景，防止残影
    screen.fill((255, 255, 255))
    # 根据当前的移动步骤获取具体的帧图片
    img = None
    if(i == 1):
        img = run1
    elif(i == 2):
        img = run2
    else:
        img = run3

    if(left):
        # 因为图片默认朝右侧，所以左侧就可以把图片水平翻转一下
        img = pygame.transform.flip(img, True, False)

    screen.blit(img, (x, y))
    # 更新屏幕
    pygame.display.flip()
    # 睡0.03秒，让他不要太快,以后会引入fps概念，目前小朋友不需要了解
    time.sleep(0.03)
